#include "japi\\YDWEJapiScript.j"

// 字符串处理工具（下标都是从1开始计算的）
// @author:wangff8@qq.com  @date:2024-06-28
library StringUtil requires YDWEYDWEJapiScript


    // 查找字符串pattern出现的起始位置，init 表示第几次出现的位置(默认1) -1表示从后往前查找
    // bool 表示是否使用纯文本模式  默认值是false
    function STR_find takes string str, string pattern, integer init, string bool returns integer
        local string retVal = EXExecuteScript("string.find('" + str + "', '" + pattern + "', " + I2S(init) + ", " + bool + ")")
        if retVal == null then
            return -1
        endif
        return S2I(retVal)
    endfunction

    // 获取字符串长度
    function STR_length takes string str returns integer
        return S2I(EXExecuteScript("string.len('" + str + "')"))
    endfunction

    // 是否包含指定字符串
    function STR_contains takes string str, string pattern returns boolean
        return STR_find(str, pattern, 1, "false") != -1
    endfunction

    // 是否包括指定的字符串（特殊字符当普通字符处理）
    function STR_containsSpecial takes string str, string pattern returns boolean
        return STR_find(str, pattern, 1, "true") != -1
    endfunction


    // 查找字符串pattern出现的次数
    function STR_findCount takes string str, string pattern returns integer
        local integer i = 1
        local integer init = 1
        local integer count = 0
        loop
            exitwhen init == -1
            set init = STR_find(str, pattern, i, "false")
            set i = init + STR_length(pattern)
            if init != -1 then
                set count = count + 1
            endif
        endloop
        return count
    endfunction

    // 替换字符串，替换str里面的pattern内容为value，count为替换次数，少于1则是代表替换所有
    function STR_Replace takes string str, string pattern, string value, integer count returns string
        local string retVal
        if count < 1 then
            set retVal = EXExecuteScript("string.gsub('" + str + "', '" + pattern + "', '" + value + "')")
        else
            set retVal = EXExecuteScript("string.gsub('" + str + "', '" + pattern + "', '" + value + "', " + I2S(count) + ")")
        endif

        return retVal
    endfunction

    // 替换全部字符串
    function STR_ReplaceAll takes string str, string pattern, string value returns string
        local string retVal
        set retVal = EXExecuteScript("string.gsub('" + str + "', '" + pattern + "', '" + value + "')")
        return retVal
    endfunction

    // 删除字符串中指定内容
    function STR_DeleteByStr takes string str, string delStr returns string
        local string retVal
        set retVal = EXExecuteScript("string.gsub('" + str + "', '" + delStr + "', '')")
        return retVal
    endfunction

    // 匹配字符串，从str里面根据pattern去匹配字符串，匹配成功返回匹配内容，失败返回null，起始匹配位置init，可以是负数，pattern类型为匹配模式
    // 匹配的规则，只能够正序匹配，如果起始位置为负数，那么就是从结尾开始算起，但依然是正序，而不是倒序。如-1 则是倒数第一位 -2 则是倒数第二位
    // String.match("abcd12345efg", "%d%d", 1); -> "12" , String.match("基础攻击+5000|n基础防御+100", "基础防御.(%d*%.?%d*)", 1); -> "100"
    function STR_match takes string str, string pattern, integer init returns string
        return EXExecuteScript("string.match('" + str + "', '" + pattern + "', " + I2S(init) + ")")
    endfunction

    // 截取字符串  包头包尾  下标从1开始
    // 截取字符串，截取str内容，从Start位置截取到End位置，Start和End位置都可以为负数，-1则为字符串长度
    function STR_sub takes string str, integer start, integer end returns string
        // return SubString(str, start - 1, end)
        return EXExecuteScript("string.sub('" + str + "', " + I2S(start) + ", " + I2S(end) + ")")
    endfunction

    // 取掉小数末尾的两个无效0
    function STR_trimZero takes string v returns string

        // 判断不包含小数点
        if not STR_containsSpecial( v, "." ) then
            return v
        endif

        if STR_length(v) == STR_find(v, "0", -1, "false") then
            set v = STR_sub(v, 1, STR_length(v)-1)
        endif
        if STR_length(v) == STR_find(v, "0", -1, "false") then
            set v = STR_sub(v, 1, STR_length(v)-1)
        endif

        if STR_length(v) == STR_find(v, ".", -1, "true") then
            set v = v + "0"
        endif

        return v
    endfunction

    // 将指定实数保留指定小数位数，并返回结果
    function keepDecimal2 takes string x, integer n returns string

        // print(string.format("%.2f", "1.034"))
        if n == 0 then
            return STR_sub(x, 1, STR_find(x, ".", 1, "true") - 1)
        else
            return STR_sub(x, 1, STR_find(x, ".", 1, "true") + n)            
        endif

    endfunction
endlibrary



